/*!
 * \file WtCtaStraFact.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader CTA策略工厂实现文件
 * 
 * \details 该文件实现了WtStraFact类的完整功能，提供CTA策略的工厂管理服务：
 *          
 *          核心功能实现：
 *          - C接口导出：支持动态库加载和插件化使用
 *          - 策略创建：根据策略名称创建具体策略实例
 *          - 策略销毁：安全释放策略实例和相关资源
 *          - 策略枚举：列出工厂支持的所有策略类型
 *          - 工厂标识：提供唯一的工厂名称
 *          
 *          支持的策略：
 *          - DualThrust：双推趋势跟踪策略
 *          - PairTradingFci：配对交易策略（待实现）
 *          - CtaXPA：XPA策略（扩展功能）
 *          
 *          作为插件化架构的重要组件，支持策略的动态加载和管理
 */

#include "WtCtaStraFact.h"
#include "WtStraDualThrust.h"

#include <string.h>
#include <boost/config.hpp>

const char* FACT_NAME = "WtCtaStraFact";	/*!< 工厂名称常量 */

/*!
 * \brief C接口导出函数
 * 
 * \details 提供标准C接口，便于动态库加载和插件化使用
 */
extern "C"
{
	/*!
	 * \brief 创建策略工厂实例
	 * \return ICtaStrategyFact接口指针
	 * 
	 * \details 创建CTA策略工厂的新实例，用于策略管理：
	 *          - 返回基类接口指针，便于多态使用
	 *          - 调用者负责通过deleteStrategyFact释放资源
	 */
	EXPORT_FLAG ICtaStrategyFact* createStrategyFact()
	{
		ICtaStrategyFact* fact = new WtStraFact();
		return fact;
	}

	/*!
	 * \brief 删除策略工厂实例
	 * \param fact 要删除的工厂实例指针
	 * 
	 * \details 安全删除策略工厂实例并释放相关资源：
	 *          - 检查指针有效性，防止空指针删除
	 *          - 清理工厂管理的所有资源
	 */
	EXPORT_FLAG void deleteStrategyFact(ICtaStrategyFact* fact)
	{
		if (fact != NULL)
			delete fact;
	}
};

/*!
 * \brief 构造函数
 * 
 * \details 初始化策略工厂，设置默认状态
 */
WtStraFact::WtStraFact()
{
}

/*!
 * \brief 析构函数
 * 
 * \details 清理工厂资源，确保所有策略实例被正确释放
 */
WtStraFact::~WtStraFact()
{
}

/*!
 * \brief 创建策略实例
 * \param name 策略名称
 * \param id 策略实例ID
 * \return 创建的策略实例指针，失败返回NULL
 * 
 * \details 根据策略名称创建对应的策略实例：
 *          - "DualThrust"：创建双推策略实例
 *          - 不支持的策略名称返回NULL
 *          - 每个策略实例具有唯一的ID标识
 *          - 调用者负责通过deleteStrategy释放策略实例
 */
CtaStrategy* WtStraFact::createStrategy(const char* name, const char* id)
{
	if (strcmp(name, "DualThrust") == 0)
		return new WtStraDualThrust(id);

	return NULL;
}

/*!
 * \brief 删除策略实例
 * \param stra 要删除的策略实例指针
 * \return 删除成功返回true，失败返回false
 * 
 * \details 安全删除策略实例并释放相关资源：
 *          - 检查策略指针有效性
 *          - 验证策略是否属于本工厂创建
 *          - 执行安全删除操作
 *          - 防止删除其他工厂创建的策略实例
 */
bool WtStraFact::deleteStrategy(CtaStrategy* stra)
{
	if (stra == NULL)
		return true;

	if (strcmp(stra->getFactName(), FACT_NAME) != 0)
		return false;

	delete stra;
	return true;
}

/*!
 * \brief 枚举工厂支持的策略
 * \param cb 枚举回调函数
 * 
 * \details 通过回调函数列出工厂支持的所有策略类型：
 *          - "DualThrust"：双推策略，完全实现，可直接使用
 *          - "PairTradingFci"：配对交易策略，基础版本，待完善
 *          - "CtaXPA"：XPA策略，扩展功能，高级特性
 *          
 *          回调参数说明：
 *          - 参数1：工厂名称
 *          - 参数2：策略名称
 *          - 参数3：是否为扩展策略（true表示高级功能）
 */
void WtStraFact::enumStrategy(FuncEnumStrategyCallback cb)
{
	cb(FACT_NAME, "DualThrust", false);
	cb(FACT_NAME, "PairTradingFci", false);
	cb(FACT_NAME, "CtaXPA", true);
}

/*!
 * \brief 获取工厂名称
 * \return 工厂名称字符串
 * 
 * \details 返回该工厂的唯一标识名称，用于：
 *          - 区分不同的策略工厂
 *          - 策略实例的归属验证
 *          - 日志记录和错误诊断
 */
const char* WtStraFact::getName()
{
	return FACT_NAME;
}